package com.zhentao.service;

import com.zhentao.config.SmsConfig;
import lombok.extern.slf4j.Slf4j;
import okhttp3.OkHttpClient;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.HashMap;
import java.util.Map;

/**
 * 短信服务 - 国阳云短信接口
 */
@Slf4j
@Service
public class SmsService {
    
    @Autowired
    private SmsConfig smsConfig;
    
    private final OkHttpClient httpClient = new OkHttpClient();
    
    /**
     * 发送验证码短信
     * @param phoneNumber 手机号
     * @param code 验证码
     * @return 是否发送成功
     */
    public boolean sendVerificationCode(String phoneNumber, String code) {
        try {
            log.info("准备发送短信 - 手机号: {}, 验证码: {}, 服务商: {}", 
                phoneNumber, code, smsConfig.getProvider());
            
            // 根据服务商类型选择发送方式
            if ("test".equals(smsConfig.getProvider())) {
                return sendTestSms(phoneNumber, code);
            } else if ("guoyang".equals(smsConfig.getProvider())) {
                return sendGuoyangSms(phoneNumber, code);
            } else {
                log.error("不支持的短信服务商: {}", smsConfig.getProvider());
                return false;
            }
        } catch (Exception e) {
            log.error("发送短信异常 - 手机号: {}, 错误: {}", phoneNumber, e.getMessage(), e);
            return false;
        }
    }
    
    /**
     * 测试模式发送短信
     */
    private boolean sendTestSms(String phoneNumber, String code) {
        log.info("测试模式：模拟短信发送成功");
        log.info("短信内容: 【中医学习助手】您的验证码是{}，该验证码5分钟内有效，请勿泄漏于他人！", code);
        log.info("手机号: {}", phoneNumber);
        return true;
    }
    
    /**
     * 国阳云发送短信
     */
    private boolean sendGuoyangSms(String phoneNumber, String code) {
        try {
            log.info("使用国阳云发送短信 - 主机: {}, 路径: {}, APPCODE: {}", 
                smsConfig.getHost(), smsConfig.getPath(), smsConfig.getAppcode());
            
            // 构建请求参数 - 按照国阳云示例格式
            Map<String, String> querys = new HashMap<>();
            querys.put("mobile", phoneNumber);
            querys.put("param", "**code**:" + code + ",**minute**:5");
            querys.put("smsSignId", smsConfig.getSmsSignId());
            querys.put("templateId", smsConfig.getTemplateId());
            
            log.info("请求参数: {}", querys);
            log.info("短信内容预览: 【中医学习助手】您的验证码是{}，该验证码5分钟内有效，请勿泄漏于他人！", code);
            
            // 构建URL查询参数 - 使用URL编码
            StringBuilder urlBuilder = new StringBuilder(smsConfig.getUrl() + "?");
            for (Map.Entry<String, String> entry : querys.entrySet()) {
                try {
                    String encodedValue = java.net.URLEncoder.encode(entry.getValue(), "UTF-8");
                    urlBuilder.append(entry.getKey()).append("=").append(encodedValue).append("&");
                } catch (Exception e) {
                    urlBuilder.append(entry.getKey()).append("=").append(entry.getValue()).append("&");
                }
            }
            String url = urlBuilder.toString().replaceAll("&$", "");
            
            log.info("请求URL: {}", url);
            
            // 构建请求 - 国阳云使用POST请求
            okhttp3.Request request = new okhttp3.Request.Builder()
                    .url(url)
                    .post(okhttp3.RequestBody.create("", okhttp3.MediaType.parse("application/json")))
                    .addHeader("Authorization", "APPCODE " + smsConfig.getAppcode())
                    .build();
            
            // 发送请求
            try (okhttp3.Response response = httpClient.newCall(request).execute()) {
                log.info("收到响应 - 状态码: {}, 状态信息: {}", response.code(), response.message());
                
                if (response.isSuccessful()) {
                    String responseBody = response.body().string();
                    log.info("短信发送响应内容: {}", responseBody);
                    
                    // 根据国阳云的响应格式判断是否发送成功
                    boolean success = false;
                    String errorMsg = "";
                    
                    try {
                        // 如果是JSON格式，尝试解析
                        if (responseBody.startsWith("{") || responseBody.startsWith("[")) {
                            // 检查是否包含错误信息
                            if (responseBody.contains("\"code\":\"1404\"") || responseBody.contains("\"msg\":\"黑名单\"")) {
                                errorMsg = "手机号在黑名单中";
                                log.warn("手机号 {} 在黑名单中，无法发送短信", phoneNumber);
                            } else if (responseBody.contains("\"code\":\"1403\"") || responseBody.contains("\"msg\":\"余额不足\"")) {
                                errorMsg = "账户余额不足";
                                log.warn("国阳云账户余额不足");
                            } else if (responseBody.contains("\"code\":\"1401\"") || responseBody.contains("\"msg\":\"签名错误\"")) {
                                errorMsg = "签名或模板配置错误";
                                log.warn("国阳云签名或模板配置错误");
                            } else {
                                // 检查成功标识 - 国阳云成功响应格式
                                success = responseBody.contains("\"success\":true") || 
                                         responseBody.contains("\"code\":200") ||
                                         responseBody.contains("\"status\":\"success\"") ||
                                         responseBody.contains("\"code\":\"0000\"") ||
                                         responseBody.contains("\"code\":\"0\"") ||
                                         responseBody.contains("\"msg\":\"成功\"");
                            }
                        } else {
                            // 文本格式响应
                            success = responseBody.contains("success") || 
                                     responseBody.contains("200") || 
                                     responseBody.contains("OK") ||
                                     responseBody.contains("成功") ||
                                     responseBody.contains("true");
                        }
                    } catch (Exception e) {
                        log.warn("解析响应内容失败，使用默认判断逻辑: {}", e.getMessage());
                        success = responseBody.contains("success") || 
                                 responseBody.contains("200") || 
                                 responseBody.contains("OK");
                    }
                    
                    if (success) {
                        log.info("手机号 {} 验证码短信发送成功", phoneNumber);
                        return true;
                    } else {
                        log.error("手机号 {} 验证码短信发送失败，响应内容: {}, 错误: {}", phoneNumber, responseBody, errorMsg);
                        
                        // 对于黑名单等特定错误，仍然允许用户继续测试
                        if (errorMsg.contains("黑名单") || errorMsg.contains("余额不足") || errorMsg.contains("配置错误")) {
                            log.warn("临时方案：由于{}，允许用户继续测试", errorMsg);
                            return true;
                        }
                        
                        return false;
                    }
                } else {
                    String responseBody = "";
                    try {
                        responseBody = response.body().string();
                    } catch (Exception e) {
                        log.warn("无法读取响应体: {}", e.getMessage());
                    }
                    
                    log.error("短信发送请求失败，状态码: {}, 状态信息: {}, 响应内容: {}", 
                        response.code(), response.message(), responseBody);
                    
                    // 分析错误原因
                    if (response.code() == 404) {
                        log.error("接口不存在，可能原因: 1)接口地址错误 2)APPCODE无效 3)服务已停止");
                    } else if (response.code() == 401) {
                        log.error("认证失败，可能原因: APPCODE无效或过期");
                    } else if (response.code() == 403) {
                        log.error("权限不足，可能原因: 账户被限制或余额不足");
                    }
                    
                    // 临时方案：即使失败也返回true，让用户能够继续测试
                    log.warn("临时方案：即使短信发送失败也返回成功，允许用户继续测试");
                    return true;
                }
            }
        } catch (Exception e) {
            log.error("国阳云发送短信异常 - 手机号: {}, 错误: {}", phoneNumber, e.getMessage(), e);
            return false;
        }
    }
    
}
